﻿/**
 * ПОБИТОВЫЕ ОПЕРАЦИИ
 *
 * Реализовать функции установки и снятия флага
 */
/**
 * @brief устанавливает флаг с желаемой позицией
 * @result преобразованное входное число с установленным флагом
 * @arg arg входное число (в котором необходимо установить флаг)
 * @arg flag_position номер бита, в котором устанавливается флаг
 */
unsigned set_flag(unsigned arg, unsigned short flag_position)
{
    unsigned i=0;
	i |=0x1;
	i <<= flag_position;
	unsigned result = arg | i;
	return result;
}
/**
 * @brief сбрасывает анавливает флаг с желаемой позицией
 * @result преобразованное входное число со сброшенным флагом
 * @arg arg входное число (в котором необходимо сбросить флаг)
 * @arg flag_position номер бита, в котором сбрасывается флаг
 */

unsigned unset_flag(unsigned arg, unsigned short flag_position)
{
	unsigned i=0;
	i ^= 0x1;
	i <<= flag_position;
	unsigned result = arg ^ i;
	return result;
}
#include <iostream>
int main()
{
	unsigned num = 0x0;

	for (unsigned i = 0; i < 32; ++i)
	{
		num = set_flag(num, i);
		std::cout
		<< std::dec << "num after setting flag "
		<< i << " = " << std::hex << num << "\n";
	}

	for (unsigned i = 0; i < 32; ++i)
	{
		num = unset_flag(num, i);
		std::cout
		<< std::dec << "num after unsetting flag "
		<< i << " = " << std::hex << num << "\n";
	}

	return 0;
}
